//
//  main.cpp
//  模版初阶
//
//  Created by 卜绎皓 on 2022/10/10.
//

#include <iostream>

//void Swap(int& left, int& right)
//{
//    int temp = left;
//    left = right;
//    right = temp;
//}
//
//void Swap(double& left, double& right)
//{
//    double temp = left;
//    left = right;
//    right = temp;
//}
//
//void Swap(char& left, char& right)
//{
//    char temp = left;
//    left = right;
//    right = temp;
//}




//template<class T>
//void Swap(T& x1, T& x2)
//{
//    T tmp = x1;
//    x1 = x2;
//    x2 = tmp;
//}
//int main()
//{
//    int a = 0, b = 1;
//    double c = 1.1, d = 2.2;
//    int* p1 = &a, *p2 = &b;
//    Swap(a, b);
//    Swap(c, d);
//    Swap(p1, p2);
//    return 0;
//}





template<class T>
T Add(const T& left, const T& right)
{
    return left + right;
}
//template<class T>
//int Add(const int& left, const int& right)
//{
//    return left + right;›
//}
int main()
{
    int a1 = 10, a2 = 20;
    double d1 = 10.1, d2 = 20.2;
//    std::cout << Add(a1, d2) << std::endl;
    
    std::cout << Add(a1, a2) << std::endl;//ok
    std::cout << Add(d1, d2) << std::endl;//ok

    //cout << Add(a1, d2) << endl;//???
    //1、用户自己来强制转化
    std::cout << Add(a1, (int)d2) << std::endl;
    std::cout << Add((double)a1, d2) << std::endl;
    //2、上面是实参去推演形参的类型，这里不需要推演，显示实例化指定T的类型
    std::cout << Add<int>(a1, d2) << std::endl;
    std::cout << Add<double>(a1, d2) << std::endl;

    return 0;
}
